package cn.lin.service.impl;

import cn.lin.domain.Catalog;
import cn.lin.domain.CourseHour;
import cn.lin.domain.Module;
import cn.lin.domain.Resource;
import cn.lin.mapper.CatalogMapper;
import cn.lin.service.CatalogService;
import cn.lin.vo.CatalogVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author cn.Lin
 * @create 2024-12-03-11:16
 */
@Service
@Transactional
public class CatalogServiceImpl implements CatalogService {

    @Autowired
    private CatalogMapper catalogMapper;

    @Override
    public int addCatalog(Catalog catalog) {

        return catalogMapper.addCatalog(catalog) ;
    }

    @Override
    public List<Module> findCatalogByClassId(Integer classId) {
        // 查询出所有的目录信息
        List<CatalogVO> catalogVOList = catalogMapper.findCatalogByClassId(classId);

        Map<Integer, Module> moduleMap = new HashMap<>();

        if (!catalogVOList.isEmpty()) {
            // 遍历vo列表，将数据放入map中
            for (CatalogVO vo : catalogVOList) {
                Integer moduleId = vo.getModuleId();
                String moduleName = vo.getModuleName();
                Integer courseId = vo.getCourseId();
                String courseName = vo.getCourseName();
                Integer resourceId = vo.getResourceId();
                String resourceName = vo.getResourceName();
                String filePath = vo.getFileName();
                Integer pageCount = vo.getPageCount();

                // 创建模块并添加到map中
                // remind:
                //  使用computeIfAbsent方法检查moduleMap中是否已经存在该模块。
                //  如果不存在，则创建一个新的Module对象并设置其模块名称，然后将其添加到moduleMap中。
                Module module = moduleMap.computeIfAbsent(moduleId, id -> {
                    Module newModule = new Module();
                    newModule.setModuleName(moduleName);
                    newModule.setModuleId(id);
                    return newModule;
                });

                // 在当前模块的课程列表中查找指定的课程。
                // 如果找不到，则创建一个新的CourseHour对象，设置其课程名称，并将其添加到模块的课程列表中。
                CourseHour course = module.getCourseHourList().stream()
                        .filter(c -> c.getCourseHourId().equals(courseId))
                        .findFirst()
                        .orElseGet(() -> {
                            CourseHour newCourse = new CourseHour();
                            newCourse.setCourseName(courseName);
                            newCourse.setCourseHourId(courseId);
                            module.getCourseHourList().add(newCourse);
                            return newCourse;
                        });

                // 创建新的资源信息并添加到课程中
                Resource resource = new Resource();
                resource.setResourceId(resourceId);
                resource.setResourceName(resourceName);
                resource.setFilename(filePath);
                resource.setPageCount(pageCount);
                course.getResourceList().add(resource);
            }
            return new ArrayList<>(moduleMap.values());
        }else{
            return null;
        }
    }

    @Override
    public Catalog showVideo(Integer id) {
        Catalog catalog = catalogMapper.showVideo(id);
        return catalog ;
    }

    @Override
    public boolean addModule(Catalog catalog) {
        catalog.setPid(0);
        catalog.setLevel(1);
        return catalogMapper.addModule(catalog) == 1;
    }

    @Override
    public boolean addClassHours(Catalog catalog) {
        catalog.setLevel(2);
        return catalogMapper.addModule(catalog) == 1;
    }

    @Override
    public boolean deleteModule(Integer id) {
        return catalogMapper.deleteModule(id) == 1;
    }
}
